/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.seguradora.persistence;

import br.com.seguradora.exception.PersistenciaException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

/**
 *
 * @author Diego
 */
public class GerenciadorDeConexao {

    private static String driver;
    private static String url;
    private static String usuario;
    private static String senha;
    private static boolean loaded = false;

    private static void init() throws PersistenciaException {
        Properties properties = new Properties();
        FileInputStream arquivoDePropriedades = null;
        try {
            arquivoDePropriedades = new FileInputStream("init/database-conf.properties");
            properties.load(arquivoDePropriedades);
            driver = properties.getProperty("jdbc.driver");
            url = properties.getProperty("jdbc.url");
            usuario = properties.getProperty("jdbc.username");
            senha = properties.getProperty("jdbc.password");
            Class.forName(driver);
            loaded = true;
        } catch (FileNotFoundException exc) {
            StringBuilder mensagem = new StringBuilder("Não foi possível conectar com banco de dados.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(mensagem.toString());
        } catch (IOException exc) {
            StringBuilder mensagem = new StringBuilder("Não foi possível conectar com banco de dados.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(mensagem.toString());
        } catch (ClassNotFoundException exc) {
            StringBuilder mensagem = new StringBuilder("Não foi possível conectar com banco de dados.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(mensagem.toString());
        } finally {
            try {
                arquivoDePropriedades.close();
            } catch (IOException ioex) {
                throw new PersistenciaException("Não foi possível liberar os recursos utilizados.");
            }
        }
    }

    /**
     * Obtém uma conexão com o banco de dados
     * @return a conexão do banco de dados
     * @throws DukeClubeException
     */
    public static Connection abreConexao() throws PersistenciaException {
        try {
            if (!loaded) {
                init();
            }
            return DriverManager.getConnection(url, usuario, senha);
        } catch (SQLException exc) {
            StringBuilder mensagem = new StringBuilder("Não foi possível conectar com banco de dados.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(mensagem.toString());
        }
    }

    /**
     * Fecha a conexão com o banco de dados
     * @param con a conexão a ser fechada
     * @throws DukeClubeException
     */
    public static void fechaConexao(Connection con) throws PersistenciaException {
        fechaConexao(con, null, null);
    }

    /**
     * Fecha a conexão com o banco de dados e o objeto PreparedStatement
     * @param con a conexão a ser fechada
     * @param stmt o objeto PreparedStatement a ser fechado
     * @throws DukeClubeException
     */
    public static void fechaConexao(Connection con, PreparedStatement stmt) throws
            PersistenciaException {
        fechaConexao(con, stmt, null);
    }

    /**
     * Fecha a conexão com o banco de dados e os objetos PreparedStatement e ResultSet
     * @param con a conexão a ser fechada
     * @param stmt o objeto PreparedStatement a ser fechado
     * @param rs o objeto ResultSet a ser fechado
     * @throws DukeClubeException
     */
    public static void fechaConexao(Connection con, PreparedStatement stmt, ResultSet rs) throws
            PersistenciaException {
        try {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException exc) {
            StringBuilder mensagem = new StringBuilder("Não foi possível finalizar a conexão com banco de dados.");
            mensagem.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(mensagem.toString());
        }
    }
   
}
